home *** CD-ROM | disk | FTP | other *** search
/ ftp.alaska-software.com / 2014.06.ftp.alaska-software.com.tar / ftp.alaska-software.com / 3pp / mxsetup.old / {app} / MxTools.prg < prev    next >
Text File  |  2001-09-27  |  16KB  |  545 lines

  1. //////////////////////////////////////////////////////////////////////
  2. //
  3. // MxTools.PRG
  4. //
  5. //  Copyright:
  6. //      Maniacc Software Inc., (c) 2001. All rights reserved.         
  7. //  
  8. //  Contents:
  9. //      General Tools and Black Box routines
  10. //   
  11. //////////////////////////////////////////////////////////////////////
  12.  
  13. #include "Gra.ch"
  14. #include "Xbp.ch"
  15. #include "Mx.ch"
  16. #include "Common.ch"
  17. #include "Dll.ch"
  18. #include "Appevent.ch"
  19.  
  20. *******************************************************************
  21. *******************************************************************
  22. ** DATE FUNCTIONS NOT PROVIDED BY Xbase++ (replace XbtTools Functions)
  23. *******************************************************************
  24. *******************************************************************
  25.  
  26. *************************************
  27. * Beginning of Month
  28. *************************************
  29.  
  30. FUNCTION bom( dDate )
  31. RETURN ctod(alltrim(str(month(dDate)))+'/1/'+alltrim(str(year(dDate))))
  32.  
  33.  
  34. *************************************
  35. * End of Month
  36. *************************************
  37.  
  38. FUNCTION eom( dDate )
  39.     LOCAL nDay, i
  40.     LOCAL nMonth := month(dDate)
  41.     LOCAL nYear  := year(dDate)
  42.     for i := 28 to 31
  43.         if !empty(ctod(alltrim(str(nMonth))+'/'+alltrim(str(i))+'/'+alltrim(str(year(dDate)))))
  44.             nDay := i
  45.         endif
  46.     next i
  47. RETURN ctod(alltrim(str(nMonth))+'/'+alltrim(str(nDay))+'/'+alltrim(str(year(dDate))))
  48.  
  49.  
  50. *************************************
  51. * Add a Month
  52. *************************************
  53.  
  54. FUNCTION addMonth( dDate, nMonths )
  55.     LOCAL nDay := day(dDate), i
  56.     LOCAL nMonth := month(dDate)
  57.     LOCAL nYear  := year(dDate)
  58.     LOCAL cDate
  59.  
  60.     nMonth := nMonth+nMonths
  61.     do while nMonth<1
  62.         nMonth := nMonth+12
  63.         nYear := nYear-1
  64.     enddo
  65.  
  66.     do while nMonth>12
  67.         nMonth := nMonth-12
  68.         nYear := nYear+1
  69.     enddo
  70.  
  71.     cDate := alltrim(str(nMonth))+"/"+alltrim(str(nDay))+"/"+alltrim(str(nYear))
  72.     do while empty(ctod(cDate))
  73.         nDay := nDay-1
  74.         cDate := alltrim(str(nMonth))+"/"+alltrim(str(nDay))+"/"+alltrim(str(nYear))
  75.     enddo
  76.  
  77.  
  78. RETURN ctod(cDate)
  79.  
  80.  
  81. *************************************
  82. * MDY() Function
  83. *************************************
  84.  
  85. FUNCTION mdy( dDate )
  86.     default dDate to date()
  87. RETURN cMonth(dDate)+" "+str(Day(dDate),2)+ ", "+str(Year(dDate),4)
  88.  
  89.  
  90.  
  91. *************************************
  92. * Is Leap Year
  93. *************************************
  94.  
  95. FUNCTION IsLeapYear( dDate )
  96. RETURN iif(!empty(stod(alltrim(str(year(dDate)))+"0229")),.T.,.F.)
  97.  
  98.  
  99. *******************************************************************
  100. *******************************************************************
  101. * CLASS MxCalendar
  102. *******************************************************************
  103. *******************************************************************
  104.  
  105. CLASS MxCalendar FROM XbpStatic
  106.  
  107.     EXPORTED:
  108.         VAR title
  109.         VAR GroupBox
  110.         VAR MonthBox, nMonth
  111.         VAR YearSpin, nYear
  112.         VAR oDay, nDay
  113.         VAR Calendar
  114.         VAR dMin, dMax
  115.         VAR aSize
  116.         VAR aDays
  117.         VAR dStartDate
  118.  
  119.     METHOD init, create, getData, setData, setDays
  120.  
  121. ENDCLASS
  122.  
  123.  
  124.  
  125. *******************************************************************
  126. * ( MxCalendar ) METHOD init
  127. *******************************************************************
  128.  
  129. METHOD MxCalendar:init( oParent, oOwner, aPos, aSize, aPresParam, lVisible )
  130.  
  131.     ::dMin := ctod("01/01/1980")
  132.     ::dMax := date()+(365*100)
  133.     ::dStartDate := date()
  134.  
  135.     ::nMonth := month(date())
  136.     ::nYear  := year(date())
  137.     ::nDay   := day(date())
  138.     ::title  := " Date "
  139.  
  140.     ::aDays := array(6,7)
  141.  
  142.     ::asize := {210,205}
  143.  
  144.     ::XbpStatic:init( oParent, oOwner, aPos, aSize, aPresParam, lVisible )
  145.     ::XbpStatic:clipChildren := .F.
  146.     ::XbpStatic:clipSiblings := .F.
  147.     ::XbpStatic:tabstop := .F.
  148.  
  149.     ::GroupBox := XbpStatic():new( self )
  150.     ::GroupBox:type := XBPSTATIC_TYPE_GROUPBOX
  151.     ::GroupBox:caption := ::title
  152.  
  153.     ::MonthBox := XbpComboBox():new( self )
  154.     ::MonthBox:type := XBPCOMBO_DROPDOWNLIST 
  155.     ::MonthBox:clipSiblings := .T.
  156.     ::MonthBox:tabstop    := .T.
  157.     ::MonthBox:Markmode    := XBPLISTBOX_MM_SINGLE
  158.     ::MonthBox:XbpListBox:itemSelected := { |uNil1, uNil2, oObj| ::nMonth := oObj:getdata()[1], ::setDays() } 
  159.  
  160.     ::YearSpin := XbpSpinButton():new( self )
  161.     ::YearSpin :setNumLimits( year(::dMin),year(::dMax) )
  162.     ::YearSpin :clipSiblings := .T.
  163.     ::YearSpin :tabstop    := .T.
  164.     ::YearSpin:keyboard := { | nKeyCode, uNIL2, oObj | iif(::nYear<>oObj:editbuffer(),(::nYear := oObj:getdata(), ::setDays()),Nil) }
  165.     ::YearSpin:endSpin := { |uNil1, uNil2, oObj| ::nYear := oObj:getdata(), ::setDays() }
  166.  
  167.     ::Calendar := MxStatic():new( self )
  168.     ::Calendar:type := XBPSTATIC_TYPE_RECESSEDBOX
  169.     ::Calendar:options := XBPSTATIC_FRAMETHICK
  170.     ::Calendar:tabStop := .T.
  171.     ::Calendar:keyboard := { | nKeyCode, uNIL2, oObj | ;
  172.                              iif(nKeyCode==xbeK_RIGHT.and.::nDay<day(eom(::getdata())),;
  173.                                 ::nDay:=::nDay+1,;
  174.                                 iif(nKeyCode==xbeK_LEFT.and.::nDay>1,;
  175.                                    ::nDay:=::nDay-1,;
  176.                                    iif(nKeyCode==xbeK_UP.and.::nDay>7,;
  177.                                       ::nDay:=::nDay-7,;
  178.                                       iif(nKeyCode==xbeK_DOWN.and.::nDay<day(eom(::getdata()))-6,;
  179.                                          ::nDay:=::nDay+7,;
  180.                                          Nil)))),;
  181.                              ::setDays() }
  182.  
  183. RETURN self
  184.  
  185.  
  186.  
  187. *******************************************************************
  188. * ( MxCalendar ) METHOD create
  189. *******************************************************************
  190.  
  191. METHOD MxCalendar:create( oParent, oOwner, aPos, aSize, aPresParam, lVisible )
  192.  
  193.     LOCAL aMonths, oXbp
  194.     LOCAL i, j, aDayPos
  195.  
  196.     ::xbpStatic:create( oParent, oOwner, aPos, ::aSize, aPresParam, lVisible )
  197.  
  198.     ::GroupBox:caption := ::title
  199.     ::GroupBox:create( ::XbpStatic,,{10,10},{190,188}, aPresParam, lVisible )
  200.  
  201.     ::MonthBox:create( ::XbpStatic,,{20,-10},{85,190}, aPresParam, lVisible )
  202.     aMonths := { "January","February","March","April",;
  203.                 "May","June","July","August",;
  204.                 "September","October","November","December" }
  205.     aEval(aMonths, {|c| ::MonthBox:addItem(c) } )
  206.     ::MonthBox:datalink    := { |x| IIf(x==NIL,::nMonth,::nMonth:=x)}
  207.     ::MonthBox:setData()
  208.  
  209.     ::YearSpin:create( ::XbpStatic,,{115,160},{75,20}, aPresParam, lVisible )
  210.     ::YearSpin:datalink    := { |x| IIf(x==NIL,::nYear,::nYear:=x) }
  211.     ::YearSpin:setdata()
  212.  
  213.     ::Calendar:create( ::XbpStatic,,{20,20},{170,133}, {{XBP_PP_BGCLR,GRA_CLR_WHITE}}, lVisible )
  214.     oXbp := XbpStatic():new()
  215.     oXbp:caption := " S  M  T  W  T  F  S "
  216.     oXbp:options := XBPSTATIC_TEXT_CENTER+XBPSTATIC_TEXT_VCENTER
  217.     oXbp:create( ::Calendar:drawingArea,,{-2,110},{170,18},{{XBP_PP_FGCLR,GRA_CLR_WHITE},;
  218.                                               {XBP_PP_BGCLR,GRA_CLR_DARKGRAY},;
  219.                                               {XBP_PP_COMPOUNDNAME,"10.Terminal"}} )
  220.     for i := 1 to 6
  221.         for j := 1 to 7
  222.             aDayPos := {((170/7)*(j-1))+3, 113-(i*18)}
  223.             ::aDays[i,j] := XbpStatic():new()
  224.             ::aDays[i,j]:options  := XBPSTATIC_TEXT_CENTER+XBPSTATIC_TEXT_VCENTER
  225.             ::aDays[i,j]:create( ::Calendar:drawingArea,,aDayPos,{18,14},;
  226.                                 {{XBP_PP_BGCLR,GRA_CLR_WHITE}} )
  227.             ::aDays[i,j]:lbClick := { |aPos,uNil,oObj| ::oDay:setColorBG(GRA_CLR_WHITE),::oDay:setColorFG(GRA_CLR_BLACK),;
  228.                                                        oOBj:setcolorBG(XBPSYSCLR_HILITEBACKGROUND),oOBj:setcolorFG(GRA_CLR_WHITE),;
  229.                                                        ::oDay := oObj,;
  230.                                                        ::nDay := val(::oDay:caption),;
  231.                                                        setAppFocus(::Calendar) }
  232.         next j
  233.     next i
  234.  
  235.     if ::dStartDate<>date()
  236.         ::setData(::dStartDate)
  237.     else
  238.         ::setDays()
  239.     endif
  240.  
  241. RETURN self
  242.  
  243.  
  244.  
  245. *******************************************************************
  246. * ( MxCalendar ) METHOD setDays
  247. *******************************************************************
  248.  
  249. METHOD MxCalendar:setDays()
  250.  
  251.     LOCAL i, j, nNextDay, nDayStart, nLastDay
  252.     
  253. //    ::Calendar:lockupdate(.T.)
  254.     nNextDay := 1
  255.     nDayStart := dow( stod( alltrim(str(::nYear))+padl(alltrim(str(::nMonth)),2,"0")+"01") )
  256.     nLastDay  := day(eom( stod( alltrim(str(::nYear))+padl(alltrim(str(::nMonth)),2,"0")+"01") ))
  257.     for i := 1 to 6
  258.         for j := 1 to 7
  259.             do while i==1.and.j<nDayStart
  260.                 ::aDays[i,j]:setcaption("")
  261.                 ::aDays[i,j]:setcolorBG(GRA_CLR_WHITE)
  262.                 ::aDays[i,j]:setcolorFG(GRA_CLR_BLACK)
  263.                 ::aDays[i,j]:hide()
  264.                 j++
  265.             enddo
  266.             if nNextDay<=nLastDay
  267.                 ::aDays[i,j]:setcaption(alltrim(str(nNextDay)))
  268.                 ::aDays[i,j]:show()
  269.             else
  270.                 ::aDays[i,j]:setcaption("")
  271.                 ::aDays[i,j]:hide()
  272.             endif
  273.             if nNextDay==::nDay
  274.                 ::aDays[i,j]:setcolorBG(XBPSYSCLR_HILITEBACKGROUND)
  275.                 ::aDays[i,j]:setcolorFG(GRA_CLR_WHITE)
  276.                 ::oDay := ::aDays[i,j]
  277.             else
  278.                 ::aDays[i,j]:setcolorBG(GRA_CLR_WHITE)
  279.                 ::aDays[i,j]:setcolorFG(GRA_CLR_BLACK)
  280.             endif
  281.             nNextDay++
  282.         next j
  283.     next i
  284. //    ::Calendar:lockupdate(.F.)
  285. //    ::Calendar:invalidateRect()
  286.  
  287. RETURN self
  288.  
  289.  
  290.  
  291.  
  292. *******************************************************************
  293. * ( MxCalendar ) METHOD getData
  294. *******************************************************************
  295.  
  296. METHOD MxCalendar:getdata()
  297. RETURN stod( alltrim(str(::nYear))+;
  298.              padl(alltrim(str(::nMonth)),2,"0")+;
  299.              padl(alltrim(::oDay:caption),2,"0") )
  300.  
  301.  
  302.  
  303. *******************************************************************
  304. * ( MxCalendar ) METHOD setData
  305. *******************************************************************
  306.  
  307. METHOD MxCalendar:setdata(dDate)
  308.     ::nMonth := month(::dStartDate)
  309.     ::MonthBox:setData()
  310.     ::nYear  := year(::dStartDate)
  311.     ::YearSpin:setData()
  312.     ::nDay   := day(::dStartDate)
  313.     ::setDays()
  314. RETURN .T.
  315.  
  316.  
  317. *******************************************************************
  318. *******************************************************************
  319. * FUNCTION MxGetDate - Returns the Date Selected - uses a MxCalendar
  320. *                      or an empty date if Cancel or "ESC" is selected 
  321. *******************************************************************
  322. *******************************************************************
  323.  
  324. FUNCTION MxGetDate( oDa, aPos, cTitle, dStartDate )
  325.  
  326.     LOCAL oDlg, oFocus, oCalendar, oXbp, mp1, mp2, nEvent
  327.     LOCAL lgetDate := .F., lDone := .F., dDate := stod("20001240")
  328.  
  329.     DEFAULT dStartDate to date()
  330.  
  331.     cTitle := iif(empty(cTitle)," Date ",cTitle)
  332.     oDlg := oDa
  333.     do while oDlg:setParent()<>AppDeskTop()
  334.         aPos[1] := aPos[1]+oDlg:setParent():currentPos()[1]
  335.         aPos[2] := aPos[2]+oDlg:setParent():currentPos()[2]
  336.         oDlg := oDlg:setParent()
  337.     enddo
  338.  
  339.     oDlg := XbpDialog():new()
  340.     oDlg:sysMenu  := .F.
  341.     oDlg:clipSiblings := .T.
  342.     oDlg:border   := XBPDLG_RAISEDBORDERTHICK_FIXED
  343.     oDlg:paint := { |aRect,uNil2,self|self:childList()[1]:invalidateRect() }
  344.     oDlg:create( AppDeskTop(),oDa,aPos,{216,255},,.F. )
  345.  
  346.     oCalendar := MxCalendar():new()
  347.     oCalendar:title := cTitle
  348.     oCalendar:dStartDate := dStartDate
  349.     oCalendar:create( oDlg:drawingArea,,{0,30},{0,0} )
  350.  
  351.     oXbp := XbpPushButton():new()
  352.     oXbp:caption := "OK"
  353.     oXbp:tabStop := .T.
  354.     oXbp:create( oDlg:drawingArea,,{23,10},{80,20})
  355.     oXbp:activate := { || lDone := .T., lgetDate := .T.}     
  356.  
  357.     oXbp := XbpPushButton():new()
  358.     oXbp:caption := "Cancel"
  359.     oXbp:tabStop := .T.
  360.     oXbp:create( oDlg:drawingArea,,{103,10},{80,20})
  361.     oXbp:activate := { || lDone := .T.}
  362.  
  363.     MxDisableSiblings( oDlg )
  364.  
  365.     oDlg:show()
  366.     oDlg:setModalState(XBP_DISP_APPMODAL)     
  367.     oFocus := setAppFocus(oDlg)
  368.     setAppFocus(oDlg:drawingArea:childList()[len(oDlg:drawingArea:childList())-1])
  369.  
  370.     do while !lDone
  371.         nEvent    := AppEvent( @mp1,@mp2,@oXbp )
  372.         oXbp:handleEvent( nEvent, mp1, mp2 )
  373.         if nEvent == xbeP_Keyboard.and.mp1==xbeK_ESC
  374.             lDone := .T.
  375.         elseif nEvent == xbeP_Keyboard.and.mp1>256
  376.             sleep(2)
  377.         endif
  378.  
  379.     enddo
  380.  
  381.     if lGetDate
  382.         dDate := oCalendar:getdata()
  383.     endif
  384.  
  385.     oDlg:setModalState(XBP_DISP_MODELESS)
  386.     MxEnableSiblings( oDlg )
  387.     oDlg:destroy()
  388.     nEvent := xbeP_None
  389.     SetAppFocus(oFocus)
  390.  
  391. RETURN dDate
  392.             
  393.  
  394.  
  395. *******************************************************************
  396. *******************************************************************
  397. * FUNCTION MxShowMsg - displays a message for nSeconds
  398. *******************************************************************
  399. *******************************************************************
  400.  
  401. FUNCTION MxShowMsg(cMessage, nSeconds)
  402.  
  403.     LOCAL oXbp, oCaption
  404.  
  405.     oXbp := MxStatic():new()
  406.     oXbp:type := MXSTATIC_TYPE_RAISEDFRAME
  407.     oXbp:nBorderWidth := 8
  408.     oXbp:nColorFrame := GRA_CLR_RED
  409.     oXbp:nColorBG := GRA_CLR_WHITE
  410.     oXbp:create( appDeskTop(),setAppWindow():drawingArea,{(appDeskTop():currentSize()[1]-200)/2,(appDeskTop():currentSize()[2]-100)/2},{200,100})
  411.  
  412.     oCaption := MxStatic():new()
  413.     oCaption:caption := cMessage
  414.     oCaption:options := XBPSTATIC_TEXT_CENTER+XBPSTATIC_TEXT_VCENTER
  415.     oCaption:create(oXbp:drawingArea,,{5,5},{oXbp:drawingArea:currentSize()[1]-10,oXbp:drawingArea:currentSize()[2]-10},{{XBP_PP_COMPOUNDNAME,"9.Arial Bold"}})
  416.  
  417.     sleep( nSeconds*100 )
  418.  
  419.     oXbp:destroy()
  420.  
  421. RETURN .T.
  422.     
  423.  
  424.  
  425.  
  426. *******************************************************************
  427. *******************************************************************
  428. *                      FUNCTION MxPlayWav()
  429. *******************************************************************
  430. *******************************************************************
  431.  
  432. FUNCTION MxPlayWav(cWavfile)
  433.  
  434.     LOCAL nDll := DllLoad("WINMM.DLL")
  435.  
  436.     if file(cWavfile).and.nDll<>0
  437.           DllCall(nDll,DLL_STDCALL,"PlaySoundA",cWavfile,0,0x00020000+0x0001)
  438.           DllUnload( nDll )
  439.        endif
  440.  
  441. RETURN .T.
  442.  
  443.  
  444.  
  445.  
  446. *******************************************************************
  447. *******************************************************************
  448. *   FUNCTION MxCalc() converts xPixels down from Top to xPixels up
  449. *******************************************************************
  450. *******************************************************************
  451.  
  452. FUNCTION MxCalc( oDa, aPos )
  453. RETURN { aPos[1],oDa:currentSize()[2]-aPos[2] }
  454.  
  455.  
  456.  
  457.  
  458. ************************************************
  459. * FUNCTION DtoR() - Convert Degrees to Radians
  460. ************************************************
  461.  
  462. FUNCTION DtoR(nAngle)
  463.  
  464.     LOCAL nPi := 3.14159265358979
  465.  
  466.     do while nAngle>=360
  467.         nAngle := nAngle-360
  468.     enddo
  469.  
  470. RETURN nPi*nAngle/180
  471.  
  472.  
  473.  
  474. ************************************************
  475. * FUNCTION Cos() - calculate Cosine from Radians
  476. ************************************************
  477.  
  478. FUNCTION cos(nRadians)
  479.  
  480.     LOCAL n := nRadians, nCos
  481.     LOCAL nPi := 3.14159265358979
  482.  
  483.     LOCAL lReverse := .F.
  484.  
  485.     if n>nPi
  486.         n := (2*nPi)-n
  487.     endif
  488.     if n>nPi/2
  489.         n := nPi-n
  490.     endif
  491.     if n>nPi/4
  492.         n := nPi/2-n
  493.         lReverse := .T.
  494.     endif
  495.     n := n*n
  496.  
  497.     nCos := abs(1-(n/2)+(n**2/24)-(n**3/720)+(n**4/40330)-(n**5/3628800))
  498.     if lReverse
  499.         nCos := abs(sqrt(1-(nCos**2)))
  500.     endif
  501.  
  502.     if nRadians>nPi/2.and.nRadians<3*nPi/2
  503.         nCos := -nCos
  504.     endif
  505.  
  506. RETURN nCos
  507.  
  508.  
  509.  
  510. ************************************************
  511. * FUNCTION Sin() - calculate sine from Radians
  512. ************************************************
  513.  
  514. FUNCTION sin(nRadians)
  515.  
  516.     LOCAL nPi := 3.14159265358979
  517.  
  518.     LOCAL nCos := cos(nRadians)
  519.     LOCAL nSin := abs(sqrt(1-(nCos**2)))
  520.     if nRadians>nPi
  521.         nSin := -nSin
  522.     endif
  523.  
  524. RETURN nSin
  525.  
  526.  
  527.  
  528.  
  529. ************************************************
  530. * FUNCTION SinCos() - calculate sine from Radians
  531. ************************************************
  532.  
  533. FUNCTION sinCos(nRadians)
  534.  
  535.     LOCAL nPi := 3.14159265358979
  536.  
  537.     LOCAL nCos := cos(nRadians)
  538.     LOCAL nSin := abs(sqrt(1-(nCos**2)))
  539.     if nRadians>nPi
  540.         nSin := -nSin
  541.     endif
  542.  
  543. RETURN {nSin,nCos}
  544.  
  545.